package cn.wolfcode.business.service.impl;

import cn.wolfcode.business.domain.BusStatement;
import cn.wolfcode.business.domain.BusStatementItem;
import cn.wolfcode.business.mapper.BusStatementItemMapper;
import cn.wolfcode.business.mapper.BusStatementMapper;
import cn.wolfcode.business.service.IBusStatementItemService;
import cn.wolfcode.business.vo.StatementItemVO;
import cn.wolfcode.common.exception.ServiceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;

/**
 * 结算单明细Service业务层处理
 *
 * @author dalang
 * @date 2023-10-31
 */
@Service
@Transactional
public class BusStatementItemServiceImpl implements IBusStatementItemService {
    @Autowired
    private BusStatementItemMapper busStatementItemMapper;
    @Autowired
    private BusStatementMapper busStatementMapper;

    /**
     * 查询结算单明细
     *
     * @param id 结算单明细主键
     * @return 结算单明细
     */
    @Override
    public BusStatementItem selectBusStatementItemById(Long id) {
        return busStatementItemMapper.selectBusStatementItemById(id);
    }

    /**
     * 查询结算单明细列表
     *
     * @param busStatementItem 结算单明细
     * @return 结算单明细
     */
    @Override
    public List<BusStatementItem> selectBusStatementItemList(BusStatementItem busStatementItem) {
        return busStatementItemMapper.selectBusStatementItemList(busStatementItem);
    }

    /**
     * 新增结算单明细
     *
     * @param busStatementItem 结算单明细
     * @return 结果
     */
    @Override
    public int insertBusStatementItem(BusStatementItem busStatementItem) {
        return busStatementItemMapper.insertBusStatementItem(busStatementItem);
    }

    /**
     * 修改结算单明细
     *
     * @param busStatementItem 结算单明细
     * @return 结果
     */
    @Override
    public int updateBusStatementItem(BusStatementItem busStatementItem) {
        return busStatementItemMapper.updateBusStatementItem(busStatementItem);
    }

    /**
     * 批量删除结算单明细
     *
     * @param ids 需要删除的结算单明细主键
     * @return 结果
     */
    @Override
    public int deleteBusStatementItemByIds(Long[] ids) {
        return busStatementItemMapper.deleteBusStatementItemByIds(ids);
    }

    /**
     * 删除结算单明细信息
     *
     * @param id 结算单明细主键
     * @return 结果
     */
    @Override
    public int deleteBusStatementItemById(Long id) {
        return busStatementItemMapper.deleteBusStatementItemById(id);
    }

    @Override
    public int saveItem(StatementItemVO vo) {
        if (vo == null) {
            throw new ServiceException("非法参数");
        }
        if (vo.getStatementId() == null) {
            throw new ServiceException("非法参数");
        }
        BusStatement busStatement = busStatementMapper.selectBusStatementById(vo.getStatementId());
        if (busStatement==null|| !BusStatement.STATUS_CONSUME.equals(busStatement.getStatus())) {
            throw new ServiceException("只有消费中状态才能保存结算单明细");
        }

        busStatementItemMapper.deleteByStatementId(vo.getStatementId());

        List<BusStatementItem> items = vo.getBusStatementItems();

        BigDecimal totalAmount = BigDecimal.ZERO;
        BigDecimal totalQuantity = BigDecimal.ZERO;

        int count = 0;
        for (BusStatementItem item : items) {
            busStatementItemMapper.insertBusStatementItem(item);
            count += 1;
            totalQuantity = totalQuantity.add(item.getItemQuantity());
            totalAmount = totalAmount.add(item.getItemPrice().multiply(item.getItemQuantity()));
        }

        if (vo.getDiscountPrice().compareTo(totalAmount)>0) {
            throw new ServiceException("优惠价不能大于总价");
        }

        busStatementMapper.updateAmount(vo.getStatementId(),totalAmount,totalQuantity,vo.getDiscountPrice());

        return count;
    }
}
